'use strict';

const Service = require('egg').Service;

/**
 * 项目组服务类
 * 处理项目组相关的数据库操作和业务逻辑
 */
class ProjectGroupService extends Service {
  /**
   * 获取所有项目组
   * 支持按名称筛选，返回未删除的项目组列表
   * @param {Object} params - 查询参数
   * @param {string} [params.project_group_name] - 项目组名称，模糊匹配
   * @returns {Promise<Array>} 项目组列表，按ID降序排序
   */
  async findAll(params = {}) {
    const { project_group_name } = params;
    
    // 构建 WHERE 条件
    let conditions = ['is_deleted = 0'];
    const queryParams = [];
    
    if (project_group_name) {
      conditions.push('project_group_name LIKE ?');
      queryParams.push(`%${project_group_name}%`);
    }

    const sql = `
      SELECT * 
      FROM tb_project_group 
      WHERE ${conditions.join(' AND ')} 
      ORDER BY project_group_id DESC
    `;
    
    const result = await this.app.mysql.query(sql, queryParams);
    return result;
  }

  /**
   * 根据ID获取项目组
   * @param {number} id - 项目组ID
   * @returns {Promise<Object|null>} 项目组信息，不存在时返回null
   */
  async findById(id) {
    const result = await this.app.mysql.query(
      'SELECT * FROM tb_project_group WHERE project_group_id = ? AND is_deleted = 0',
      [id]
    );
    return result[0];
  }

  /**
   * 检查项目组名称是否已存在
   * @param {string} groupName - 项目组名称
   * @param {number} [excludeId] - 排除的项目组ID（用于更新时检查）
   * @returns {Promise<boolean>} 是否存在
   */
  async checkNameExist(groupName, excludeId = null) {
    let sql = 'SELECT COUNT(*) as count FROM tb_project_group WHERE project_group_name = ? AND is_deleted = 0';
    const params = [groupName];

    if (excludeId) {
      sql += ' AND project_group_id != ?';
      params.push(excludeId);
    }

    const result = await this.app.mysql.query(sql, params);
    return result[0].count > 0;
  }

  /**
   * 创建新项目组
   * @param {Object} data - 项目组数据
   * @param {string} data.project_group_name - 项目组名称
   * @param {string} [data.remark] - 备注
   * @returns {Promise<Object|null>} 创建的项目组信息，名称重复时返回null
   */
  async create(data) {
    // 检查名称是否已存在
    const exists = await this.checkNameExist(data.project_group_name);
    if (exists) {
      return null;
    }

    const result = await this.app.mysql.insert('tb_project_group', {
      project_group_name: data.project_group_name,
      remark: data.remark,
      is_deleted: 0,
    });
    
    return await this.findById(result.insertId);
  }

  /**
   * 更新项目组
   * @param {number} id - 项目组ID
   * @param {Object} data - 更新数据
   * @param {string} data.project_group_name - 项目组名称
   * @param {string} [data.remark] - 备注
   * @returns {Promise<Object|{error: string}|null>} 更新后的项目组信息，不存在返回null，名称重复返回错误对象
   */
  async update(id, data) {
    // 先检查记录是否存在且未删除
    const group = await this.findById(id);
    if (!group) {
      return null;
    }

    // 检查新名称是否与其他项目组重复
    const exists = await this.checkNameExist(data.project_group_name, id);
    if (exists) {
      return { error: 'duplicate_name' };
    }

    // 执行更新
    await this.app.mysql.update('tb_project_group', {
      project_group_name: data.project_group_name,
      remark: data.remark,
    }, {
      where: { project_group_id: id, is_deleted: 0 }
    });
    
    return await this.findById(id);
  }

  /**
   * 软删除项目组
   * 如果项目组下有人员则不允许删除
   * @param {number} id - 项目组ID
   * @returns {Promise<Object|{error: string}|null>} 删除的项目组信息，不存在返回null，有人员时返回错误信息
   */
  async delete(id) {
    // 先检查记录是否存在且未删除
    const group = await this.findById(id);
    if (!group) {
      return null;
    }

    // 检查项目组下是否有人员
    const hasPersons = await this.checkHasPersons(id);
    if (hasPersons) {
      return { error: 'has_persons' };
    }

    // 执行软删除
    await this.app.mysql.update('tb_project_group', {
      is_deleted: 1,
    }, {
      where: { project_group_id: id, is_deleted: 0 }
    });

    return group;
  }

  /**
   * 检查项目组下是否有人员
   * @param {number} groupId - 项目组ID
   * @returns {Promise<boolean>} 是否有人员
   */
  async checkHasPersons(groupId) {
    const result = await this.app.mysql.query(
      'SELECT COUNT(*) as count FROM tb_person_project_group WHERE project_group_id = ?',
      [groupId]
    );
    return result[0].count > 0;
  }
}

module.exports = ProjectGroupService; 